/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.losalpes.basket;

import com.losalpes.buy.IBuyService;
import com.losalpes.catalog.ICatalogService;
import com.losalpes.client.IClientService;
import com.losalpes.persistence.entity.Cliente;
import com.losalpes.persistence.entity.Compra;
import com.losalpes.persistence.entity.ItemCompra;
import com.losalpes.persistence.entity.Mueble;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateful;

/**
 *
 * @author Henry.Quiroga
 */
@Stateful
public class BasketService implements IBasketService {

    @EJB
    ICatalogService catalogService;
    @EJB
    IBuyService buyService;
    @EJB
    IClientService clientService;

    private ArrayList<ItemCompra> items = new ArrayList<ItemCompra>();
    private int total;
    private Compra compra = new Compra();
    private boolean pagando;

    /**
     * Obtiene informacion de la compra actual
     * @return
     */
    public Compra getCompra() {
        return compra;
    }

    /**
     * Establece el cliente actual de la compra
     * @param cliente
     */
    public void setCompra(Compra compra) {
        this.compra = compra;
    }

    /**
     * Recalcula y devuelve el tota actual de la transaccion
     * @return entero
     */
    public int getTotal() {
        recalcular();
        return total;
    }

    /**
     * multiplica cantidades y suma para obtener el total
     */
    public void recalcular() {
        total = 0;
        for (ItemCompra itemCompra : items) {
            itemCompra.setValorTotal(itemCompra.getCantidad() * itemCompra.getMueble().getPrecio());
            total += itemCompra.getValorTotal();
        }
    }

    /**
     * Agrega un elemento a la canasta
     * @param id identificador del mueble
     */
    public void add(Long id) {
        Mueble mueble = catalogService.getMueble(id);

        Boolean bEncontrado = false;
        //Recorremos los elementos para no agregar dos veces el mismo mueble
        for (ItemCompra itemCompra : items) {
            if (itemCompra.getMueble().getId() == mueble.getId()) {
                bEncontrado = true;
                itemCompra.setCantidad(itemCompra.getCantidad() + 1);
                break;
            }
        }

        if (!bEncontrado) {
            items.add(new ItemCompra(mueble, 1));
        }
    }

    /**
     * Elimina un elemento de la canasta
     * @param id identificador del mueble
     */
    public void remove(Long id) {
        Mueble mueble = catalogService.getMueble(id);

        //Recorremos los elementos para eliminar el elemento de la referencia
        for (ItemCompra itemCompra : items) {
            if (itemCompra.getMueble().getId() == mueble.getId()) {
                items.remove(itemCompra);
                break;
            }
        }
        recalcular();
    }

    /**
     * Recalcula el total y obtiene la lusta de elementos del carrito
     * @return
     */
    public List getItems() {
        recalcular();
        return items;
    }

    /**
     * Elimina todos los elementos de la lista y recalcula la variable total
     */
    public void limpiarItems() {
        items.clear();
        recalcular();
    }

    /**
     * Comprueba si el usuario ya se encuentra en la fase de pago
     * @return booleano indicando si ya esta pagando
     */
    public boolean isPagando() {
        return pagando;
    }

    /**
     * Establece el indicador de que el cliente ya esta pagando
     * @param pagando
     */
    public void setPagando(boolean pagando) {
        this.pagando = pagando;
    }

    
    /**
     * Verifica si el usuario esta logeado para poder continuar
     * @param username usuario con el que esta logeado el usuario
     * @return String de navegacion
     */
    public String confirmarOrden(String username) {         
        if (compra.getCliente() == null) {
            Cliente cliente = clientService.getCliente(username);

            compra.setCliente(cliente);
        }


        if (compra.getCliente() == null) {
            //Enviamos al cliente para que haga login
            pagando =true;
            return "login";
        } else {
            //Continua normalmente
            return "confirmarOrden";
        }
    }

    /**
     * Crea el objeto compra y envia al usuario para que confirme su orden
     * @return
     */
    public String buyProduct() {
        java.util.Date ahora = new java.util.Date();
        compra.setFecha(new Date(ahora.getTime()));
        compra.setItems((ArrayList<ItemCompra>) items);
        compra.setOrden("0000");
        compra.setValorTotal(total);

        String mensaje = catalogService.verificarExistencias((ArrayList<ItemCompra>) items);

        if (mensaje.equals("")) {
            return "confirmarOrden";
        } else {
            return "";
        }

    }

    /**
     * Actualiza el inventario y realiza la compra
     * @return un string de navegacion
     */
    public String completarPago() {
        buyService.add(compra);
        catalogService.actualizarInventario((ArrayList<ItemCompra>) items);
        limpiarItems();
        setPagando(false);
        return "successfulBuy";
    }
}